home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil07.TXT < prev    next >
Text File  |  1992-09-02  |  15KB  |  319 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                  7.Teil...
  4.  
  5. So, weiter mit den Bildern....Ausser Groesse farben, anzahl und
  6. laenge, muss der Amiga noch wissen wo er die Plane findet die er darstellen
  7. soll. Dazu dienen die sogenannten Bitplanepointer. Sie liegen fuer die
  8. erste Plane bei $dff0e0 und $dff0e2.
  9.  
  10. In dem nun folgenden listing habe ich die ganzen einstellungen in die
  11. Copperliste gesteckt..Obwohl man groesse und anzahl der Planes auch einmal
  12. einstellen kann ist es besser es immer wieder in der Copperliste macht.
  13. Erstmal das listing, dann werde ich die neue sache erklaeren..
  14.  
  15.  
  16. start:
  17. execbase=       4
  18. openlibrary=    -408
  19. vhposr=         $dff006
  20. forbid=         -30-102
  21. permit=         -30-108
  22. dmacon=         $dff096
  23. intena=         $dff09a
  24. dmaconr=        $dff002
  25. cop1lc =        $dff080
  26.  
  27.  
  28.         move.w  #$0020,dmacon
  29.         move.w  #$4000,intena
  30.         move.l  execbase,a6
  31.         jsr     forbid(a6)
  32.  
  33.         Lea $5fffc,a0
  34.         Lea $dff180,a1
  35.         Move.w #1,d0
  36. Colorloop:
  37.         Move.w (a0)+,(a1)+
  38.         dbf d0,colorloop
  39.  
  40.         move.l  #copperliste,cop1lc
  41.  
  42. wait:
  43.         btst    #6,$bfe001
  44.         bne     wait
  45.  
  46.         move.l  execbase,a6
  47.         jsr     permit(a6)
  48.         lea     gfxname(pc),a1
  49.         jsr     openlibrary(a6)
  50.         move.l  d0,a6
  51.         move.w  #$83e0,dmacon
  52.         move.w  #$c000,intena
  53.         move.l  38(a6),cop1lc
  54.         moveq   #0,d0
  55.         rts
  56.  
  57. gfxname:        dc.b "graphics.library",0
  58.  
  59. >Extern         "bild1.raw",$5fffc
  60. even
  61.  
  62. copperliste:
  63. dc.w $00e0,$0006        ;Hi und Lo pointer der planeadresse im ram
  64. dc.w $00e2,$0000
  65. dc.w $0100,$1200        ;Bplcon0 1 Plane, Lores
  66. dc.w $008e,$3081        ;Diwstrt
  67. dc.w $0090,$30c1        ;Diwstop
  68. dc.w $0092,$0038        ;Ddfstrt
  69. dc.w $0094,$00d0        ;Ddfstop
  70. dc.l $-2
  71.  
  72.  
  73. So das ist es, ihr koenntet es euch rausschneiden..es ist einen etwas
  74. verbesserte Version des alten Copperliste programm. Geaendert wurden sachen
  75. die hinterher beim Ausbauen des Listing, stoeren wuerden...und vielleicht
  76. sogar Guru`s veranstalten.
  77.  
  78. Wichtig ist das ihr nach dem Assemblieren `Y` drueckt und return bevor ihr
  79. das mit `J` startet, damit das Bild nachgeladen wird.
  80.  
  81. So die erste aenderung die euch aufallen wird, sind zwei neue register,
  82. naemlich DMACON und INTENA.
  83. Das register INTENA heiát INterupts ENAble, was soviel bedeutet Erlaubte
  84. Interupts. Mit ihm schaltet man alle moeglichen interrupts des Amiga an
  85. oder aus...wir schalten sie aus....das gekoppelt mit Forbid, gibt uns die
  86. ganze zeit des Amigas, er macht jetzt nur noch das was wir wollen.
  87.  
  88. Das zweite neue register ist DMACON. Es oeffnet die Tore fuer die einzelnen
  89. DMA kanaele. Was DMA (direct Memory Access) ist wisst ihr schon. Es gibt
  90. fuer alles, was der Amiga kann DmA kanaele, vom und zum Ram. Diese kanaele
  91. werden solange sie angeschaltet sind immer wieder auf inhalt ueberprueft,
  92. auch wenn man ueberhaupt nichts z.b mit sprites macht, wird dauernd
  93. ueberprueft. Das kostet natuerlich zeit, deshalb schalten wir direkt mal
  94. die Sprite DMA aus, da wir die im moment nicht brauchen.
  95.  
  96. So, jetzt muss ich euch aber noch etwas ueber das DMACON und INTENA
  97. register erklaeren.
  98.  
  99. In den 16 Bits der Register, sind 15 schalter der die DMA kanaele oder die
  100. Interrupts eingebaut. Der 16 schalter sagt wie der Zugriff ausssieht.
  101.  
  102. Den Wert den ich in diese Register schreibe ist eigentlich garnicht der der
  103. hinterher drin steht. Den das 16 Bit sagt aus was gemacht wird. Ist es
  104. gesetzt, werden alle bits die im Wort was ich dort hinschreibe gesetzt sind
  105. auch im DMACON register gesetzt. Ist es geloescht, werden alle im Wert
  106. gesetzten Bits, im DMACON register geloescht. Mit dem Wort das ich am
  107. anfang in das DMACON register schreibe, schalte ich den Sprite Kanal aus.
  108.  
  109. Der wert ist #$0020, in Bits 0000000000100000, das heisst das das Fuenfte
  110. Bit geloescht wird. Bit 5 ist fuer den SpriteKanal.
  111. Wenn ich wie jetzt vom Cli aus komme, sind Sprite, Bitplane und Blitter DMA
  112. angeschaltet. Die bitplane DMA muss ich an lassen, damit wir uberhaupt ein
  113. Bild sehen, die Blitter dma kann ich ruhig anlassen, weil es sich mit ihm
  114. etwas anders verhaelt, da dort ein Chip dahinter steht der den Kanal
  115. ueberprueft, und darum kostet es uns keine Zeit, deshalb lassen wir ihn
  116. einfach an.
  117. Allerdings werden sich einige jetzt fragen warum ich den Sprite kanal
  118. ausschalten, wir brauchen doch kaum Zeit, ein Voellig einfaches Programm,
  119. wieso muss man denn da schon Zeit sparen ? Ganz einfach...Die Sprites im
  120. Amiga haben eine Sehr schlechte angewohnheit. Sobald ihr Kanal angeschaltet
  121. wird sind sie auch da. Da sie aber kein Aussehen und keine Bildschirm
  122. Position zugewiesen bekommen haben, schnappen sie sich immer die werte die
  123. sie gerade auf dem datenBus finden. Deshalb sieht man nur Truemmer.
  124. Probierts es doch mal aus, loescht einfach die erste Zeile mit dem DMACON
  125. ganz, dann koennt ihr das sehen, wie das aussieht....
  126.  
  127. So wenn ihr weiter guckt faellt euch die Colorcopy-routine auf, sie setzt
  128. die Farben aus der Colormap, die ja vor der Bitplane liegt (habt ihr
  129. eingestellt).
  130. Wenn ihr bald mit mehr farben arbeitet dann muesst ihr natuerlich auch
  131. diese Routine umstellen, wie das wisst ihr schon.
  132.  
  133. Das Oeffnen der Graphics.Library habe ich jetzt nach unten verlegt, es kann
  134. schwierigkeiten geben wenn man wie ich das vorher gemacht habe. Erst die
  135. Graphics.library oeffnen, zeiger retten und dann am ende auslesen. Es kommt
  136. schon mal vor das man dort arbeitet wo dann die geoeffnete Library liegt.
  137. Und dann ueberschreibt man sie und kriegt nicht mehr den wert den man
  138. braucht. Das ist mir schon passiert, und dann wundert man sich... aber
  139. sowas wird euch bestimmt auch noch oft genug passieren.
  140.  
  141. So, jetzt kommen wir zu einem Neue Seka befehl, de das Einbinden von
  142. Dateien erlaubt...bzw. er laedt dateien in den Amiga Speicher ein. Das
  143. koennen Bilder, Musiken oder alles moegliche sein. Seine Syntax lautet
  144.  
  145. >Extern "Name",Ziel (label oder Adresse), Laenge (Label oder fester wert)
  146.  
  147. also ein beispiel aufruf, der die ertsen 5000 Bytes vom Bild mit dem Namen
  148. Auto nach $40000 einlaedt saehe dann so aus - >Extern "Auto",$40000,5000
  149.  
  150. Die option laenge braucht man eigentlich nie, deshalb lasse ich die immer
  151. weg.
  152. Aktiviert wird das ganze nach dem Assemblieren mit `Y`, dann schaut der
  153. Seka das Listing nochmal nach Externen Kommandos durch und fuehrt diese
  154. dann aus.
  155.  
  156. Noch was...wenn ihr die Funktion Openlibrary benutzt, achtet darauf das der
  157. name der Library genauso geschrieben ist wie es im Buch oder in meinem Kurs
  158. steht...naemlich klein und mit punkt getrennt, sonst erkennt der Befehl
  159. diese nich und bricht ab...
  160.  
  161. graphics.library  ist der absolut richtige name dafuer...also denkt dran.
  162.  
  163. Was man machen muss um ein Bild mit 32 farben darzustellen ist ja wohl
  164. klar..aber ich erklaere es doch lieber mal.
  165.  
  166. Also erstmal das Bild ueberhaupt malen. Konvertieren (denkt an die
  167. Colormap, sie sollte davor liegen).
  168.  
  169. Dann muesst ihr das >Extern kommando um schreiben 1. Den neuen namen
  170. einsetzen 2. muesst ihr den Ladebeginn vorverlegen, da die Colormap jetzt
  171. ja groesser ist. Wieviel ihr das jetzt vorverlegen muesst rechnet man so
  172. aus....Farben*2 , bei 32 farben sind das 64 bytes...64 in Hexdezimal sin
  173. $40, jetzt muesst ihr nur noch Bildanfang -$40 rechnen. Bei $60000 weare
  174. das dann $5ffc0..also die adresse im Extern kommando muss also $5ffc0
  175. lauten. Genau diese Adresse muesst ihr dann natuerlich auch in der
  176. Farbenroutine einsetzen, und den Counter auf 32-1 setzen.
  177.  
  178. Dann muesst ihr noch in der Copperliste das BPLCON0 register auf $5200
  179. setzen, da es 5 planes sind. Dann muesst ihr natuerlich noch die
  180. BitplanePointer fuer die weiteren planes setzen. Da die Planes im
  181. RAW-Format alle hintereinander liegen, koennen wir die weiteren Adresse
  182. einfach ausrechnen. Also, unser Bild hat die maáe 320*256, das sind 256 mal
  183. 320 bits. Erstmal brauchen wir die Bytes..also 320/8 gleich 40. 40 mal 256
  184. gleich 10240...in Hex $2800. Also lauten die Bitplane Startadressen so
  185.  
  186. 1. $60000
  187. 2. $62800
  188. 3. $65000
  189. 4. $67800
  190. 5. $6a000
  191.  
  192. Einsetzen duerfte kein Problem mehr sein oder...
  193.  
  194. Falls das zu schwierig war muesst ihr leider die Letzten zwei Teile nochmal
  195. durchlesen, denn dann ist etwas Falsch gelaufen.
  196.  
  197. Natuerlich waere es besser ihr wuerdet das jetzt mal selber versuchen, um
  198. zu sehen was man schon kann. Das fertige teil kommt natuerlich bei dem
  199. Naechsten Effekt als listing rueber, aber das ist ja nicht der Sinn der
  200. Sache, oder ?
  201.  
  202. So jetzt koennt ihr erstmal einen Zeit mit dem Krempel rumspielen, und alle
  203. moeglichen Bilder Konvertieren. Ihr solltet auch mal versuchen mit
  204. Interlace, oder Hires zu arbeiten..wir werden das in diesem Kurs zwar nicht
  205. benutzen, aber vielleicht findet einer seine leidenschaft darin und
  206. arbeitet fortan nur dadrin. Es ist relativ einfach den Kurs auf Hires
  207. umzusetzen. Naja..ich persoenlich halte nicht soviel von dem Flackern was
  208. der Amiga uns da praesentiert. Die einzige schoene sache ist der HAM modus,
  209. er ist allerdings ziemlich speicherverbrauchend (heisst doch so, oder ?)
  210.  
  211. Jetzt mal eine kleine erklaerung....Eine sache die ihr euch vielleicht auch
  212. schon mal gefragt habt.
  213.  
  214. Ein Freund fragte mich letztens "Hoermal Sascha, warum arbeiten wir den im
  215. RAW-format wenn wir Bilder darstellen, und nicht im IFF format wie die
  216. ganzen Malprogramme es tun. Die werden doch sicher einen Grund haben das zu
  217. tun. Und wenn ich mir den Umstand angucke, vonwegen das mit dem
  218. Konvertieren und so, verstehe ich das nicht so recht"
  219.  
  220. Is Klar was er meint.....Aber der Amiga kann halt nur im RAW formt
  221. arbeiten...das IFF-ILBM format, wie es fuer bilder heisst. Ist ein Pack
  222. verfahren. Die bilder werden auf eine ganze bestimmte art und weise
  223. Zusammen gepackt, gleichzeitig werden auch alle wichtigen daten des Bildes
  224. mit abgespeichtert, als da waeren ..Farben, Groesse...Anzahl der Planes,
  225. modus und so. Das IFF-Format gibt es auch fuer
  226. TextFiles..Samples..Musikstuecke. Es soll den Daten Transfer verschiedener
  227. Programm untereinander ermoeglichen...ne tolle Idee...aber wir muessen das
  228. dann erstmal Konvertieren...Es ist keine Atemberaubende Sache die Dateien
  229. zu entpacken, allerdings dauert es ein Parr sekunden, und das waere Extrem
  230. langweilig finde ich, und deshalb Konvertieren wir das Vorher, O.K ?
  231.  
  232. So, nachdem wir auch mal Bilder dargestellt haben koennen wir schon
  233. anfangen etwas ansehnliches zu Bauen. Dazu muessen wir aber das Thema
  234. Bilder wieder kurz verlassen, um dann mit einem Sagenhaften effekt wieder
  235. zu kommen.
  236.  
  237. Wer kennt nicht Stripes, dieses Schicke Cli farbspielerei, bei der es
  238. aussieht als wenn der Bildschirm von einem Dicken Rohr durchzogen wuerde,
  239. oder andere sachen, bei denen der ganze bildschirm von Rohren (die richtige
  240. bezeichnung ist Tubes (sprich : Tjubs) ueberzogen ist. Nette sache..habt
  241. ihr denn schon mal versucht eine selbstgemachte diashow mit einen der
  242. Zahlreichen IFF anzeige Routinen zu machen...Hah, das war wohl nichts, in
  243. dem meisten faellen jedenfalls. Warum ist klar, die eine Copperliste Stellt
  244. die andere ab. Deshalb werden wir diesen Effekt zusammen mit einem Bild.
  245.  
  246. Erstmal die Beschriebung der Technik dieser `Tubes`.
  247. Jede Zeile wird von Copper abgewartet, und dann ein farbwert aus einer
  248. Tabelle reingschrieben. Die Tabelle ist so angelegt das die einzelnen
  249. Farbtoenne immer nur einige Nouancen unterscheiden. Wenn man diese Tabelle
  250. von Dunkel bis nach hell und dann wieder bis dunkel macht, und das auf
  251. einem Kleinen raum dann kommt eine Tubes zustande.
  252.  
  253. Wenn wir allerdings den Ganzen bildschirm mit Tubes ueberziehen wollten.
  254. dann wir schon im NTSC bereich 256 zeilen. Auf die Art und weise wie wir
  255. das jetzt machen, vonwegen die Copperliste direkt im SourceCode ablegen,
  256. das hieáe, wir haetten 512 zeilen Text nur fuer die Copperliste. Das waere
  257. wohl doch ein Bisschen sehr viel arbeit, oder ?
  258.  
  259. Deshalb arbeiten wir mit einer Routine von 10 bis 12 Zeilen die uns diese
  260. Copperliste erstellt.
  261. Das heisst wir legen die einzelnen Elemente die so eine Copperliste hat,
  262. wie z.b der move-befehl, oder die Farbadresse $180 in die Datenregister,
  263. dann legen wir eine Tabelle an fuer die Farben (das machen wir hinterher)
  264. und wir setzen das erste wort fuer den Wait befehl in ein Register.
  265.  
  266. Dann durchlaufen wir eine Schleife, indem alle Bausteine die noetig sind
  267. immer wieder auf die Copperliste gesetzt werden, das ist wie ein Haus
  268. bauen.
  269. Ein durchlauf muesste dann so ausehen das erstmal die Position fuer den
  270. Waitbefehl geschrieben wird, dann der Wait befehl selber...dann kaeme das
  271. farbregisert was ich ansprechen will (in unserem fall waere das $0180 oder
  272. $0182) und dann der Farbwert der in das Register geschrieben werden soll.
  273.  
  274. Dann muesste das Positions wort fuer den Wait befehl, so bearbeitet werden
  275. das es auf die naechste Zeile zeigt, und das wort fuer die Farbe muesst
  276. geaendert werden. Ob das durch auslesen einer Tabelle oder durch normales
  277. Addieren geschieht (was uebrigens auch schoene Effekte zustande bringt) ist
  278. erstmal gleich. Jetzt kommt erstmal so eine Routine, die eine Solche
  279. Copperliste erstellt. Wie man sie Einbaut das zeige ich dannach.
  280.  
  281.         Lea $50000,a0           ; Adresse ab der die Copperliste liegen
  282.                                 ; soll.
  283.         Move.w #$-2,d0          ; Wait-befehl ($fffe) nach d0
  284.         Move.w #$0180,d1        ; Farbregister wert nach d1
  285.         Move.w #$200f,d2        ; Erstes Positions wort fuer den Waitbefehl
  286.                                 ; nach d2
  287.         Move.w #$0000,d3        ; Erstes farbwort nach d3
  288.         Move.w #$80,d4          ; Counter nach d4
  289. Copperloop:
  290.         Move.w d2,(a0)+         ; Durch die Postinkrementale adressierung
  291.                                 ; koennen wir die Copperliste stueck fuer
  292.                                 ; stueck zusammen bauen. Erstes Positions
  293.                                 ; Wort schreiben.
  294.         Move.w d0,(a0)+         ; Wait-Befehl schreiben
  295.         Move.w d1,(a0)+         ; Erste farbregisterwort setzen
  296.         Move.w d3,(a0)+         ; Erstes Farbwort setzen
  297.  
  298.                                 ; Jetzt ist der erste Durchlauf geschafft.
  299.                                 ; Wir beginnen mit dem Modifizeren der
  300.                                 ; Ausgangswerte.
  301.         Add.w #$0100,d2         ; Waitpostionswort auf die naechste zeile
  302.                                 ; setzen.
  303.         Add.w #$0003,d3         ; Farbwert addieren
  304.                                                                         /\
  305.         Dbf d4,copperloop       ; waren es schon $80 zeilen, wenn nicht _]
  306.                                 ; Zueruck
  307.         Move.l #$01800000,(a0)+ ; Ganz unten wieder auf schwarz schalten
  308.  
  309.         Move.l #$-2,(a0)+       ; $fffffffe als endemarkierung fuer die
  310.                                 ; Copperliste.
  311.         Move.l #$50000,cop1lc   ; Erstellte Copperliste auch aktivieren
  312. Das prinzip duerfte klar sein, oder...
  313.  
  314. In der Naechsten Folge bauen wir das ding ein...
  315.  
  316. C.U.
  317.  
  318.                 Jeff Kandle
  319.